package contest;

import java.util.Arrays;

/**
 * @BelongsProject: LeetCode
 * @BelongsPackage: com.elvis.leetcode.contest
 * @Author: Elvis
 * @CreateTime: 2019-03-10 11:10
 * Description: K 次取反后最大化的数组和
 *给定一个整数数组 A，我们只能用以下方法修改该数组：
 * 我们选择某个个索引 i 并将 A[i] 替换为 -A[i]，然后总共重复这个过程 K 次。
 * （我们可以多次选择同一个索引 i。）
 *
 * 以这种方式修改数组后，返回数组可能的最大和。
 * 示例 1：
 *
 * 输入：A = [4,2,3], K = 1
 * 输出：5
 * 解释：选择索引 (1,) ，然后 A 变为 [4,-2,3]。
 * 示例 2：
 *
 * 输入：A = [3,-1,0,2], K = 3
 * 输出：6
 * 解释：选择索引 (1, 2, 2) ，然后 A 变为 [3,1,0,2]。
 * 示例 3：
 *
 * 输入：A = [2,-3,-1,5,-4], K = 2
 * 输出：13
 * 解释：选择索引 (1, 4) ，然后 A 变为 [2,3,-1,5,4]。
 *
 *
 * 提示：
 *
 * 1 <= A.length <= 10000
 * 1 <= K <= 10000
 * -100 <= A[i] <= 100
 */
public class Leetcode1005 {

    /**
     * 未修饰
     * @param A
     * @param K
     * @return
     */
    public int largestSumAfterKNegations(int[] A, int K) {
        Arrays.sort(A);
        //the min
        int result = 0;
        // count number < 0
        int count = 0;
        // count number = 0;
        int flag = 0;
        for (int i = 0; i < A.length; i++) {
            if (A[i] < 0)
                count++;
            else if (A[i] == 0)
                flag = 1;
            else
                break;
        }
        if (K <= count){
            for (int i = 0; i < A.length; i++) {
                if (i < K){
                    result += -A[i];
                }else {
                    result += A[i];
                }
            }
        }else if (flag != 1 && (K - count) % 2 == 1){
            for (int i = 0; i < A.length; i++) {
                if (A[i] < 0){
                    A[i] = -A[i];
                    result += A[i];
                }else {
                    result += A[i];
                }
            }
            Arrays.sort(A);
            result -= 2 * A[0];
        }else {
            for (int i = 0; i < A.length; i++) {
                result += Math.abs(A[i]);
            }
        }
        return result;
    }

    /**
     * 大佬版
     * @param A
     * @param K
     * @return
     */
    public int largestSumAfterKNegations_A(int[] A, int K) {
        Arrays.sort(A);
        int n=A.length;
        for (int i=0;i<n;i++)
        {
            if (A[i]>0 || K==0) break;
            A[i]=-A[i];
            K--;
        }
        K%=2;
        if (K>0)
        {
            Arrays.sort(A);
            A[0]=-A[0];
        }
        int ans=0;
        for (int x:A) ans+=x;
        return ans;
    }

    public static void main(String[] args) {
        int[] A = {4,2,3};
        new Leetcode1005().largestSumAfterKNegations(A, 1);
    }
}
